進程
指的是一個應用程式執行的最小單位,而線程
指的是在這個進程當中所執行的單個或多個執行的程式碼。
例如:使用windows作業系統(進程),可以同時打開不同的程式(線程)
例如:使用vs code(進程),可以同時下載插件(線程),可以同時打開開發者伺服器等等
創造Thread
的方法一:
Thread
的subclass
subclass
中重寫run()
方法,並且將需要透過這個thread
執行的程式碼定義在run()
方法中subclass
並且透過實例化的物件使用start()
方法,就可以執行class PrintNum extends Thread {
@Override
public void run() {
for(int i = 0; i <= 100; i++) {
System.out.println(i)
}
}
}
class PrintNumTest {
public static void main(String[] args) {
PrintNum printNum = new PrintNum();
// 啟動新的thread,並且在另一個線程中執行
printNum.start();
// 在main的線程執行
for(int i = 0; i <= 100; i++) {
System.out.println(i)
}
}
}
printNum.start()
啟動後會去執行run()
中的循環,這時候main()
中的循環也會在自己的線程中同時執行,所以可能會在console中產生交互的數字出現
創造Thread
的方法二
Runnable
接口的類Runnable
的run()
方法實作Thread
類Thread
類的構造器後,使用start()
方法class PrintNum implements Runnable {
@Override
public void run() {
for(int i = 0; i <= 100; i++) {
System.out.println(i)
}
}
}
class PrintNumTest {
public static void main(String[] args) {
PrintNum printNum = new PrintNum();
// 這裡也是一個多態的操作
Thread t1 = new Thread(printNum);
// 啟動新的thread,並且在另一個線程中執行
t1.start();
// 在main的線程執行
for(int i = 0; i <= 100; i++) {
System.out.println(i)
}
}
}
常見的Thread
方法:
currentThread
:獲取當前執行程式碼的線程getName
:獲取線程名稱setName
:設置線程名稱sleep(long 毫秒)
:【靜態方法】將線程休眠毫秒數yield
:【靜態方法】釋放CPU的執行權(如果有其他線程同時進行時,有可能會優先讓其他線程先執行)join
:在a線程中使用b線程的join()
方法時,會讓a線程阻塞,直到b線程運行完後才繼續執行a線程isAlive
:判斷當前線程是否存活線程中的優先級,代表的只是有較高的機會
被優先執行,但不是絕對,可以透過
getPriority()
取得當前線程的優先級(默認優先級是5
)setPriority()
設置當前線程的優先級(只可以設定1-10之間)Thread
中也有三個優先級的常量可以使用:
MAX_PRIORITY
:最高優先級是10
MIN_PRIORITY
:最低優先級是1
NORN_PRIORITY
:默認優先級是5